#pragma once

#include <iostream>
#include <set>
#include <string>
#include "InetAddr.hpp"
#include "Log.hpp"

using namespace LogModule;
//命令集合
class Commd
{
    public:
    Commd()
    {
        _whitle_list.insert("ls");
        _whitle_list.insert("ls -a");
        _whitle_list.insert("ls -al");
        _whitle_list.insert("who");
        _whitle_list.insert("whoami");
        _whitle_list.insert("touch haha.txt");
    }
    ~Commd()
    {}
    bool IsSafeCmd(const std::string& cmd)
    {
        auto it=_whitle_list.find(cmd);
        return it!=_whitle_list.end();
    }
    std::string Execute(const std::string& cmd,InetAddr& addr)
    {
        if(!IsSafeCmd(cmd))
        {
            return std::string("坏人");
        }
        std::string who=addr.StringAddr();
        //执行命令
        FILE* fp=popen(cmd.c_str(),"r");
        if(fp==nullptr)
        {
            return "该命令不存在："+cmd;
        }

        std::string res;
        char line[1024];//缓冲区
        while(fgets(line,sizeof(line),fp))
        {
            res+=line;
        }
        pclose(fp);
        return res;
    }
    private:
        std::set<std::string> _whitle_list; //白名单
};